package com.fy.market.strategy.model.enums;

import lombok.AllArgsConstructor;
import lombok.Getter;

import java.util.Arrays;

/**
 * 规则模型枚举
 * @author fwq
 * @date 2025-09-04
 * @desc 规则模型枚举
 */
@Getter
@AllArgsConstructor
public enum RuleModelEnum {

    /**
     * 默认规则 - 不做额外处理，兜底规则
     */
    RULE_DEFAULT(0, "rule_default", "默认规则 - 兜底规则"),

    /**
     * 权重规则 - 根据用户积分消耗返回可抽奖范围
     */
    RULE_WEIGHT(1, "rule_weight", "权重规则 - 根据用户积分消耗返回可抽奖范围"),

    /**
     * 黑名单规则 - 黑名单用户过滤，命中黑名单则直接返回
     */
    RULE_BLACKLIST(2, "rule_blacklist", "黑名单规则 - 黑名单用户过滤，命中黑名单则直接返回"),

    /**
     * 随机值计算规则
     */
    RULE_RANDOM(3, "rule_random", "随机值计算规则"),

    /**
     * 抽奖几次后解锁规则
     */
    RULE_LOCK(4, "rule_lock", "抽奖几次后解锁规则"),

    /**
     * 幸运奖(兜底奖品)规则
     */
    RULE_LUCK_AWARD(5, "rule_luck_award", "幸运奖(兜底奖品)规则"),

    /**
     * 决策树 - 是否走决策树
     */
    RULE_TREE(6, "RULE_TREE", "决策树");

    /**
     * 规则编码
     */
    private final Integer code;

    /**
     * 规则名称
     */
    private final String name;

    /**
     * 规则描述
     */
    private final String desc;

    /**
     * 根据code获取枚举
     *
     * @param code 规则编码
     * @return 规则模型枚举
     */
    public static RuleModelEnum of(Integer code) {
        if (code == null) {
            return null;
        }
        for (RuleModelEnum ruleModelEnum : values()) {
            if (ruleModelEnum.getCode().equals(code)) {
                return ruleModelEnum;
            }
        }
        return null;
    }

    /**
     * 根据name获取枚举
     *
     * @param name 规则名称
     * @return 规则模型枚举
     */
    public static RuleModelEnum ofName(String name) {
        if (name == null) {
            return null;
        }
        return Arrays.stream(values())
                .filter(ruleModelEnum -> ruleModelEnum.getName().equals(name))
                .findFirst()
                .orElse(null);
    }
}